﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//fscanf和fprintf
//struct S
//{
//	char name[20];
//	int age;
//	float score;
//};
//int main()
//{
//	struct S s = { "张三",20,65.5f };
//	FILE* ptr = fopen("test.txt", "w");
//	if (ptr == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	fprintf(ptr, "%s %d %f", s.name, s.age, s.score);//fprintf是向文件中写数据
//	//printf("%s %d %f", s.name, s.age, s.score);
//	fclose(ptr);
//	ptr = NULL;
//	return 0;
//}
//struct S
//{
//	char name[20];
//	int age;
//	float score;
//};
//int main()
//{
//	struct S s = { 0 };
//	FILE* ptr = fopen("test.txt", "r");
//	if (ptr == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	fscanf(ptr, "%s %d %f", s.name, &(s.age), &(s.score));//fscanf从文件中读取数据放在s中
//	//scanf("%s %d %f", s.name, &s.age, &s.score);
//	printf("%s %d %f", s.name, s.age, s.score);//读取的内容打印在屏幕上
//
//	fclose(ptr);
//	ptr = NULL;
//	return 0;
//}

//scanf从标准输入流（屏幕）上读取格式化的数据
//fscanf从指定输入流上读取格式化的数据
// sscanf在字符串中读取格式化数据
//printf把数据以格式化的形式打印在标准输出流（屏幕）上
//fprintf把数据以格式化的形式打印在指定输出流上
//sprintf把格式化的数据转换为字符串的形式

//struct S//sscanf和sprintf
//{
//	char name[20];
//	int age;
//	float score;
//};
//int main()
//{
//	char buff[200] = { 0 };
//	struct S s = { "张三",20,65.5f };
//	sprintf(buff,"%s %d %f", s.name, s.age, s.score);//写
//	printf("%s\n", buff);
//	struct S t = { 0 };
//	sscanf(buff,"%s %d %f", s.name, &(s.age), &(s.score));//读
//	printf("%s %d %f", t.name, t.age, t.score);
//	return 0;
//}

//fread和fwrite
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6 };
//	FILE* pf = fopen("test.txt", "wb");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	fwrite(arr,sizeof(arr[0]),sz,pf);//以二进制形式写
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}
//int main()
//{
//	int arr[5] = { 0};
//	FILE* pf = fopen("test.txt", "rb");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	fread(arr, sizeof(arr[0]), 5, pf);//以二进制形式读
//	int i = 0;
//	for (i = 0; i < 5; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


//fseek：⽂件指针的位置和偏移量来定位⽂件指针（⽂件内容的光标）int fseek ( FILE * stream, long int offset, int origin )
// long int offset偏移量
//SEEK_SET:文件的起始位置
//SEEK_CUR：文件指针当前位置
//SEEK_END：文件末尾
//int main()
//{
//	FILE* pf = fopen("test.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	int ch = 0;
//	ch=fgetc(pf);
//	printf("%c\n", ch);
//
//	//fseek(pf,4, SEEK_CUR);
//	fseek(pf, -4, SEEK_END);
//
//	ch = fgetc(pf);
//	printf("%c\n", ch);
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//ftell:返回⽂件指针相对于起始位置的偏移量.long int ftell ( FILE * stream );
//int main()
//{
//	FILE* pf = fopen("test.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	int ch = 0;
//	ch=fgetc(pf);
//	printf("%c\n", ch);
//
//	fseek(pf, -4, SEEK_END);
//	printf("%d\n", ftell(pf));
//	
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//rewind让⽂件指针的位置回到⽂件的起始位置
//int main()
//{
//	FILE* pf = fopen("test.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	int ch = 0;
//	ch=fgetc(pf);
//	printf("%c\n", ch);
//
//	fseek(pf, -4, SEEK_END);
//
//	ch = fgetc(pf);
//	printf("%c\n", ch);
//
//	rewind(pf);
//	ch = fgetc(pf);
//	printf("%c\n", ch);
//
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


//feof的作⽤：当⽂件读取结束的时候，判断是否遇到⽂件尾结束
//ferror:读取的时候发生错误
//fgetc 如果读取正常，返回的是读取到字符的ASCLL码值。读取过程中遇到文件末尾或者发生错误返回EOF
//fgets 如果读取正常，返回的是存储读取到的字符串的字符数组的地址。读取过程中遇到文件末尾或者发生错误返回NULL
//int main()
//{
//	FILE* pf = fopen("test.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	int ch = 0;
//	while ((ch = getc(pf)) != EOF)
//	{
//		printf("%c\n", ch);
//	}
//	if (feof(pf))
//		printf("遇到文件末尾，读取正常结束\n");
//	else if (ferror(pf))
//		perror("fgetc");
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//拷贝文件test1.txt->test2.txt
int main()
{
	FILE* pf1 = fopen("test1.txt", "r");
	if (pf1 = NULL)
	{
		perror("fopen");
		return 1;
	}
	FILE* pf2 = fopen("test2.txt", "w");
	if (pf2 = NULL)
	{
		perror("fopen");
		return 1;
	}
	int ch = 0;
	while ((ch = fgetc(pf1)) != EOF)
	{
		fputc(ch, pf2);
	}
	fclose(pf1);
	pf1 = NULL;
	fclose(pf2);
	pf2 = NULL;
	return 0;
}
